package com.code.p9.工厂方法模式.P2通用工厂模式;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

/**
 * 描述:
 * 延迟加载工厂 + 缓存+单列
 * ProductFactory负责产品类对象的创建工作，并且通过prMap变量产生一个缓存，对需要
 * 再次被重用的对象保留
 *
 * @author CodeYang_Site
 * @version 2021/6/6 14:42
 */
public class ProductFactory {
    /**
     * 1.缓存对象,指定为指定产品
     */
    private static final Map<Class, Product> productMap = new HashMap<>();

    public static synchronized Product createProduct(Class cls) {

        Product product = null;
        // 1. 判断缓存中是否有这个类
        if (productMap.containsKey(cls)) {
            //有
            product = productMap.get(cls);

        } else {
            //没有就要生产了
            try {
                //1.得到字节码对象
                Class<?> aClass = Class.forName(cls.getName());
                //2.得到无参数的构造方法
                Constructor<?> constructor = aClass.getDeclaredConstructor();
                //3.设置实例为可以访问--可能构造器是Private
                constructor.setAccessible(true);
                //4.使用通过方法得到实例对象
                product = (Product) constructor.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("生产失败");
            }
            //加入缓存
            productMap.put(cls, product);

        }
        return product;
    }
}
